import time
import cv2
import numpy as np

POINT_X = 1242
POINT_Y = 739
def find_leftmost_shape(image_path, is_yoke, color='red'):
    """
    加载一张图片，识别其中指定颜色的所有图形，并返回最左侧图形的左上角坐标。

    参数:
    image_path (str): 输入图片的路径。
    color (str): 要识别的颜色，可选 'red'、'blue'、'green'、'yellow'，默认为 'red'

    返回:
    tuple: (x, y) 坐标，代表最左侧指定颜色图形的左上角。如果未找到图形，则返回 None。
    """
    # 1. 读取图片
    image = cv2.imread(image_path)
    if image is None:
        print(f"错误：无法读取图片，请检查路径：{image_path}")
        return None

    # 2. 将图片从 BGR 转换到 HSV 颜色空间
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

    # 3. 定义各种颜色的 HSV 范围
    color_ranges = {
        'red': [
            ([0, 120, 70], [10, 255, 255]),  # 低红色范围
            ([170, 120, 70], [180, 255, 255])  # 高红色范围
        ],
        'blue': [
            ([100, 120, 70], [130, 255, 255])  # 蓝色范围
        ],
        'green': [
            ([35, 50, 50], [85, 255, 255])  # 绿色范围
        ],
        'yellow': [
            ([20, 100, 100], [30, 255, 255])  # 黄色范围
        ]
    }

    # 检查输入的颜色是否有效
    if color not in color_ranges:
        print(f"错误：不支持的颜色 '{color}'。请选择 'red', 'blue', 'green' 或 'yellow'")
        return None

    # 4. 根据颜色创建掩码（mask）
    color_mask = np.zeros(hsv_image.shape[:2], dtype=np.uint8)
    for lower, upper in color_ranges[color]:
        lower_bound = np.array(lower)
        upper_bound = np.array(upper)
        mask = cv2.inRange(hsv_image, lower_bound, upper_bound)
        color_mask = cv2.add(color_mask, mask)

    # 5. 形态学操作（开运算和闭运算）来移除噪点并填充空洞
    kernel = np.ones((5, 5), np.uint8)
    color_mask = cv2.morphologyEx(color_mask, cv2.MORPH_OPEN, kernel)
    color_mask = cv2.morphologyEx(color_mask, cv2.MORPH_CLOSE, kernel)

    # 6. 在掩码中寻找轮廓
    contours, _ = cv2.findContours(color_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    if not contours:
        print(f"图片中未找到{color}色图形。")
        return POINT_X, POINT_Y

    # 7. 找到最左侧的轮廓
    min_x = float('inf')
    leftmost_coords = None

    for contour in contours:
        # 计算每个轮廓的边界框
        x, y, w, h = cv2.boundingRect(contour)
        # 忽略过小的噪点区域
        if w * h > 100:  # 面积阈值
            if x < min_x:
                min_x = x
                leftmost_coords = (x + 1025, y + 645)
    if leftmost_coords == (1025,645) or y <= 20:
        return POINT_X, POINT_Y
    # 8. 返回结果
    if leftmost_coords:
        # print(f"已找到最左侧的{color}色图形。")
        print(leftmost_coords)
        return leftmost_coords
    else:
        print(f"未找到足够大的{color}色图形。")
        return POINT_X, POINT_Y


# --- 主程序 ---
if __name__ == "__main__":
    # 请将这里的路径替换为您自己的图片路径
    image_file = 'captured_region.png'

    # 测试不同颜色
    colors_to_test = ['red', 'blue', 'green', 'yellow']

    for color in colors_to_test:
        # print(f"\n正在检测{color}色图形...")
        coordinates = find_leftmost_shape(image_file, color=color)

        # if coordinates:
        print(f"最左侧{color}色图形的左上角坐标是: x = {coordinates[0]}, y = {coordinates[1]}")
